home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / emerald / emrldsys.lha / Language / Compiler / buildATs.c < prev    next >
C/C++ Source or Header  |  1990-08-16  |  14KB  |  459 lines

  1. /*
  2.  * @(#)buildATs.c    1.5  1/20/89
  3.  */
  4. #include "assert.h"
  5. #include "error.h"
  6. #include "ident.h"
  7. #include "nodes.h"
  8. #include "builtins.h"
  9. #include "symbols.h"
  10. #include "sequence.h"
  11. #include "MyParser.h"
  12. #include "semantics.h"
  13. #include "evaluate.h"
  14. #include "buildATs.h"
  15. #include "opNames.h"
  16. #include "system.h"
  17. #include "map.h"
  18. #include "flags.h"
  19. #include "environment.h"
  20. #include "trace.h"
  21.  
  22. static int doClearSymbols = FALSE;
  23.  
  24. int compareSigs(a, b)
  25. NodePtr *a, *b;
  26. {
  27.   assert((*a)->tag == P_OPSIG);
  28.   assert((*a)->b.opsig.name->tag == P_OPNAME);
  29.   assert((*b)->tag == P_OPSIG);
  30.   assert((*b)->b.opsig.name->tag == P_OPNAME);
  31.   return((*a)->b.opsig.name->b.opname.id - (*b)->b.opsig.name->b.opname.id);
  32. }
  33.  
  34. static Map copyMap;
  35.  
  36. NodePtr copyTree(), _copyTree();
  37. #define COPYTREE(T) ((int)(T) <= 0x200 ? (T) : _copyTree(T))
  38.  
  39. void copySymbol(new, old)
  40. NodePtr new, old;
  41.   register Symbol s = old->b.symdef.symbol;
  42.   register Symbol newS;
  43.   register NodePtr r;
  44.   NodePtr list;
  45.   register int mapResult;
  46.  
  47.   mapResult = Map_Lookup(copyMap, (int)s);
  48.   if (old->tag == P_SYMDEF) {
  49.     newS = (Symbol) malloc(sizeof(STEntry));
  50.     *newS = *s;
  51.     Map_Insert(copyMap, (int)s, (int)newS);
  52.     if (mapResult == NIL) {
  53.       /* this is the first time we saw the symbol */
  54.     } else {
  55.       /* we need to fix previously seen symrefs */
  56.       assert(mapResult < 0);
  57.       list = (NodePtr) (-mapResult);
  58.       assert(list->tag == T_SEQUENCE);
  59.       Sequence_For(r, list)
  60.     assert(r->tag == P_SYMREF);
  61.     r->b.symref.symbol = newS;
  62.       Sequence_Next
  63.       free((char *) list);
  64.     }
  65.     if (doClearSymbols) {
  66.       newS->value.ATinfo = NULL;
  67.       newS->value.CTinfo = NULL;
  68.       newS->value.value = NULL;
  69.       newS->isManifest = FALSE;
  70.       newS->hasValue = FALSE;
  71.     } else {
  72.       newS->value.ATinfo = COPYTREE(s->value.ATinfo);
  73.       newS->value.CTinfo = COPYTREE(s->value.CTinfo);
  74.       newS->value.value = COPYTREE(s->value.value);
  75.     }
  76.     new->b.symdef.symbol = newS;
  77.   } else {
  78.     assert(old->tag == P_SYMREF);
  79.     if (mapResult != NIL && mapResult > 0) {
  80.       new->b.symref.symbol = (Symbol) mapResult;
  81.     } else {
  82.       if (mapResult == NIL) {
  83.     list = F_NewNode(T_SEQUENCE, 4);
  84.     Map_Insert(copyMap, (int)s, -(int)list);
  85.       } else {
  86.     list = (NodePtr) (-mapResult);
  87.       }
  88.       Sequence_Add(&list, new);
  89.       new->b.symref.symbol = old->b.symref.symbol;
  90.     }
  91.   }
  92. }
  93.  
  94. static Boolean isExported(opname, exports)
  95. register NodePtr opname, exports;
  96. {
  97.   register NodePtr q, exportList;
  98.   if (exports == NN) return(FALSE);
  99.   exportList = exports->b.export.syms;
  100.   assert(opname->tag == P_OPNAME);
  101.   assert(isASequence(exportList));
  102.   Sequence_For(q, exportList)
  103.     assert(q->tag == P_OPNAME);
  104.     if (q->b.opname.id == opname->b.opname.id) return(TRUE);
  105.   Sequence_Next
  106.   return(FALSE);
  107. }
  108.  
  109. NodePtr buildComplicatedSymbol();
  110. extern void sortATOps();
  111.  
  112. NodePtr buildATOfObject(o)
  113. NodePtr o;
  114. {
  115.   register NodePtr at, p, ops, q;
  116.   register Symbol st, newst;
  117.   int stage;
  118.   
  119.   assert(o->tag == P_OBLIT);
  120.   at = Construct(P_ATLIT, 4, o->b.oblit.sfname, NULL, NULL, NULL);
  121.   at->b.atlit.f.immutable = o->b.oblit.f.immutable;
  122.  
  123.   TRACE4(copy, 1, "BuildATOf %s %s 0x%08x -> 0x%08x", 
  124.     tagNames[(int)o->tag],
  125.     o->b.oblit.name == NN ? "unknown" : 
  126.       ST_SymbolName(o->b.oblit.name->b.symdef.symbol),
  127.     o,
  128.     at);
  129.  
  130.   st = ST_Fetch(o->b.oblit.name->b.symdef.symbol);
  131.   at->b.atlit.name = 
  132.     buildComplicatedSymbol(P_SYMDEF, ST_SymbolName(st), 0, "_IAT");
  133.   at->b.atlit.name->b.symdef.symbol = 
  134.     ST_Create(NN, at->b.atlit.name->b.symdef.ident);
  135.   newst = ST_Fetch(at->b.atlit.name->b.symdef.symbol);
  136.   newst->itsName = Ident_Name(newst->itsIdent);
  137.   at->b.atlit.name->b.symdef.ident = newst->itsIdent;
  138.  
  139.   newst->value.value = at;
  140.   newst->value.ATinfo = refToBuiltin(B_INSTAT, SIGNATUREINDEX);
  141.   newst->value.CTinfo = refToBuiltin(B_INSTCT, SIGNATUREINDEX);
  142.   newst->isManifest = TRUE;
  143.   newst->hasValue = TRUE;
  144.  
  145.   at->b.atlit.ops = NULL;
  146.   for (stage = 0; stage < 2; stage++) {
  147.     if (stage == 0) {
  148.       ops = o->b.oblit.monitor;
  149.       if (ops != NULL) {
  150.     assert(ops->tag == P_MONITOR);
  151.     ops = ops->b.monitor.ops;
  152.       }
  153.     } else if (stage == 1) {
  154.       ops = o->b.oblit.ops;
  155.     } 
  156.     Sequence_For(p, ops)
  157.       assert(p->tag == P_OPDEF);
  158.       q = p->b.opdef.sig;
  159.       assert(q->tag == P_OPSIG);
  160. #ifdef COPYSIGS
  161.       Sequence_Add(&at->b.atlit.ops, copyTree(q, TRUE));
  162. #else
  163.       Sequence_Add(&at->b.atlit.ops, q);
  164. #endif
  165.       p->b.opdef.isExported = isExported(q->b.opsig.name, o->b.oblit.export);
  166.     Sequence_Next
  167.   }
  168.   sortATOps(at);
  169. #ifdef COPYSIGS
  170.   newAssignTypes(at, 1);
  171. #else
  172.   at->b.atlit.f.typesAreAssigned = TRUE;
  173. #endif
  174.  
  175.   at->b.atlit.f.isVector = o->b.oblit.f.isVector;
  176.   if (at->b.atlit.f.isVector) {
  177.     at->b.atlit.f.cannotBeConformedTo = TRUE;
  178.     at->b.atlit.codeOID = o->b.oblit.codeOID;
  179.   }
  180.   if (o->b.oblit.f.dependsOnTypeVariable) {
  181.     assert(o->b.oblit.f.writeSeparately == FALSE);
  182.     at->b.atlit.f.isManifest = FALSE;
  183.     at->b.atlit.f.writeSeparately = FALSE;
  184.     at->b.atlit.f.dependsOnTypeVariable = TRUE;
  185.     at->b.atlit.id = AllocateOID();
  186.     OTInsert(at, at->b.atlit.id);
  187.   } else if (o->b.oblit.f.typeDependsOnTypeVariable) {
  188.     at->b.atlit.f.isManifest = FALSE;
  189.     at->b.atlit.f.writeSeparately = FALSE;
  190.     at->b.atlit.f.dependsOnTypeVariable = TRUE;
  191.     at->b.atlit.id = AllocateOID();
  192.     OTInsert(at, at->b.atlit.id);
  193.   } else {
  194.     defineGlobal(at, 0);
  195.   }
  196.   return(at);
  197. }
  198.  
  199. NodePtr getExportedATOfObject(o, fAT)
  200. NodePtr o, fAT;
  201. {
  202.   NodePtr exports, export, ops, p, q, at;
  203.   OID opID;
  204.   Boolean *isDefined;
  205.   int numSigs;
  206.   Symbol st, newst;
  207.   register int i, j;
  208.  
  209.   assert(o->tag == P_OBLIT);
  210.   assert(fAT->tag == P_ATLIT);
  211.   exports = o->b.oblit.export;
  212.   if (exports != NULL) {
  213.     assert(exports->tag == P_EXPORT);
  214.     exports = exports->b.export.syms;
  215.   }
  216.   numSigs = Sequence_Length(exports);
  217.   at = Construct(P_ATLIT, 4, o->b.oblit.sfname, NULL, NULL, NULL);
  218.   at->b.atlit.f.immutable = o->b.oblit.f.immutable;
  219.  
  220.   TRACE4(copy, 1, "GetExportedATOf %s %s 0x%08x -> 0x%08x", 
  221.     tagNames[(int)o->tag],
  222.     o->b.oblit.name == NN ? "unknown" : 
  223.       ST_SymbolName(o->b.oblit.name->b.symdef.symbol),
  224.     o,
  225.     at);
  226.  
  227.   st = ST_Fetch(o->b.oblit.name->b.symdef.symbol);
  228.   at->b.atlit.name = 
  229.     buildComplicatedSymbol(P_SYMDEF, ST_SymbolName(st), 0, "_XAT");
  230.   at->b.atlit.name->b.symdef.symbol = 
  231.     ST_Create(NN, at->b.atlit.name->b.symdef.ident);
  232.   newst = ST_Fetch(at->b.atlit.name->b.symdef.symbol);
  233.   at->b.atlit.name->b.symdef.ident = newst->itsIdent;
  234.   newst->value.value = at;
  235.   newst->value.ATinfo = refToBuiltin(B_INSTAT, SIGNATUREINDEX);
  236.   newst->value.CTinfo = refToBuiltin(B_INSTCT, SIGNATUREINDEX);
  237.   newst->hasValue = TRUE;
  238.   newst->isManifest = TRUE;
  239.  
  240.   at->b.atlit.ops = NULL;
  241.   isDefined = (Boolean *) calloc((unsigned)numSigs, sizeof(Boolean));
  242.   ops = fAT->b.atlit.ops;
  243.   Sequence_For(p, ops)
  244.     assert(p->tag == P_OPSIG);
  245.     q = p->b.opsig.name;
  246.     assert(q->tag == P_OPNAME);
  247.     opID = q->b.opname.id;
  248.     for (j = 0; j < numSigs; j++) {
  249.       export = exports->b.children[j];
  250.       assert(export->tag == P_OPNAME);
  251.       if (export->b.opname.id == opID) {
  252.     NodePtr theop;
  253.     isDefined[j] = TRUE;
  254.     theop = findObjectOperation(o, export);
  255.     if (theop->b.opdef.isPrivate) {
  256.       ErrorMessage(theop, "Private operations may not be exported");
  257.     }
  258. #ifdef COPYSIGS
  259.     Sequence_Add(&at->b.atlit.ops, copyTree(p, TRUE));
  260. #else
  261.     Sequence_Add(&at->b.atlit.ops, p);
  262. #endif
  263.     break;
  264.       }
  265.     }
  266.   Sequence_Next
  267.   if (Sequence_Length(at->b.atlit.ops) != numSigs) {
  268.     for (i = 0; i < numSigs; i++) {
  269.       if (!isDefined[i]) {
  270.     BeginErrorMessage(o);
  271.     (void) sprintf(error_buffer, "Exported operation %s is not defined", 
  272.       ON_Name(exports->b.children[i]->b.opname.id));
  273.     ErrorWrite(error_buffer);
  274.     EndErrorMessage();
  275.       }
  276.     }
  277.   }
  278.   if (Sequence_Length(at->b.atlit.ops) > 1) {
  279.     TRACE1(atctsort, 2, "QSorting at %s", ATName(at));
  280.     qsort((char *)&(at->b.atlit.ops->b.children[0]),
  281.       Sequence_Length(at->b.atlit.ops),
  282.       sizeof(NodePtr),
  283.       compareSigs);
  284.     for (i = 0; i < Sequence_Length(at->b.atlit.ops); i++) {
  285.       TRACE2(atctsort, 4, "Operation %s has number %d",
  286.     SigName(at->b.atlit.ops->b.children[i]), i);
  287.     }
  288.   }
  289.  
  290.   defineGlobal(at, 0);
  291.   at->b.atlit.f.isVector = o->b.oblit.f.isVector;
  292.   if (at->b.atlit.f.isVector) {
  293.     at->b.atlit.f.cannotBeConformedTo = TRUE;
  294.     at->b.atlit.codeOID = o->b.oblit.codeOID;
  295.   }
  296.   at->b.atlit.f.writeSeparately = fAT->b.atlit.f.writeSeparately;
  297.   at->b.atlit.f.isManifest = fAT->b.atlit.f.isManifest;
  298.   at->b.atlit.f.dependsOnTypeVariable = fAT->b.atlit.f.dependsOnTypeVariable;
  299.   return(at);
  300. }
  301.  
  302. void initializebuildATs()
  303. {
  304. }
  305.  
  306. extern Boolean internalConforms();
  307.  
  308. Boolean isAnAT(p)
  309. register NodePtr p;
  310. {
  311.   register Symbol st;
  312.   if ((int) p <= 0x200) {
  313.     return(FALSE);
  314.   } else if (p->tag == P_ATLIT) {
  315.     return (TRUE);
  316.   } else if (p->tag == P_BUILTINLIT) {
  317.     return(p->b.builtinlit.whichType != KARRAY &&
  318.        p->b.builtinlit.whichType != KVECTOR);
  319.   } else if (p->tag == P_SYMREF) {
  320.     st = ST_Fetch(p->b.symref.symbol);
  321.     return(st->isManifest && isAnAT(st->value.value));
  322.   } else if (p->tag == P_OBLIT) {
  323.     return(p->b.oblit.instat != NULL);
  324.   } else if (p->tag == P_GLOBALREF) {
  325.     resolveGlobal(p, (ValuePtr)NULL);
  326.     return(isAnAT(p->b.globalref.value));
  327.   } else {
  328.     return(FALSE);
  329.   }
  330. }
  331.  
  332. /*
  333.  * We need to copy all nodes making this object.
  334.  */
  335.  
  336. NodePtr _copyTree(p)
  337. register NodePtr p;
  338. {
  339.   register NodePtr newNode;
  340.   register int i, nRealChildren;
  341.   if ((int) p <= 0x200) {
  342.     newNode = p;
  343.   } else if ((newNode = (NodePtr) Map_Lookup(copyMap, (int)p)) != (NodePtr) NIL) {
  344.     /* do nothing, newNode is the right thing to return */
  345.   } else if ((p->tag == P_ATLIT || p->tag == P_OBLIT) && p->b.atlit.f.writeSeparately) {
  346.     assert(p->b.atlit.id != 0);
  347.     newNode = Construct(P_GLOBALREF, 0);
  348.     newNode->b.globalref.id = p->b.atlit.id;
  349.     newNode->b.globalref.value = p;
  350.   } else {
  351.     nRealChildren = p->nChildren - p->firstChild;
  352.     newNode = F_NewNode(p->tag, nRealChildren);
  353.     newNode->nChildren += nRealChildren;
  354.     newNode->lineNumber = p->lineNumber;
  355.     Map_Insert(copyMap, (int)p, (int)newNode);
  356.     for (i = 0; i < newNode->firstChild; i++)
  357.       newNode->b.children[i] = p->b.children[i];
  358.  
  359.     switch (p->tag) {
  360.       case P_SYMDEF:
  361.       case P_SYMREF:
  362.     copySymbol(newNode, p);
  363.     break;
  364.       case P_INVOC:
  365.     if (doClearSymbols) newNode->b.invoc.resultTypeOID = 0;
  366.     for (i = newNode->firstChild; i < newNode->nChildren; i++)
  367.       newNode->b.children[i] = COPYTREE(p->b.children[i]);
  368.     break;
  369.       case P_VECTORLIT:
  370.     if (doClearSymbols) newNode->b.vectorlit.vectorType = NN;
  371.     for (i = newNode->firstChild; i < newNode->nChildren; i++)
  372.       newNode->b.children[i] = COPYTREE(p->b.children[i]);
  373.     break;
  374.       case P_OBLIT:
  375.       case P_ATLIT:
  376.     TRACE4(copy, 1, "Copying %s %s 0x%08x -> 0x%08x", 
  377.       tagNames[(int)p->tag],
  378.       p->b.oblit.name == NN ? "unknown" : 
  379.         ST_SymbolName(p->b.oblit.name->b.symdef.symbol),
  380.       p,
  381.       newNode);
  382.     if (doClearSymbols) {
  383.       newNode->b.oblit.setq = COPYTREE(p->b.oblit.setq);
  384.       newNode->b.oblit.name = COPYTREE(p->b.oblit.name);
  385.       newNode->b.oblit.name->b.symdef.symbol->isSelf = TRUE;
  386.       newNode->b.oblit.name->b.symdef.symbol->value.value = newNode;
  387.       newNode->b.oblit.id = 0;
  388.       newNode->b.oblit.codeOID = 0;
  389.       newNode->b.oblit.f.isManifest = FALSE;
  390.       newNode->b.oblit.f.writeSeparately = FALSE;
  391.       newNode->b.oblit.f.isTypeVariable = FALSE;
  392.       newNode->b.oblit.f.inExecutableConstruct = FALSE;
  393.       newNode->b.oblit.f.dependsOnTypeVariable = FALSE;
  394.       newNode->b.oblit.f.typesAreAssigned = FALSE;
  395.       newNode->b.oblit.f.typesHaveBeenChecked = FALSE;
  396.       if (p->tag == P_ATLIT) {
  397.         newNode->b.atlit.ops = COPYTREE(p->b.atlit.ops);
  398.       } else {
  399.         newNode->b.oblit.myat = NULL;
  400.         newNode->b.oblit.instat = NULL;
  401.         newNode->b.oblit.export = COPYTREE(p->b.oblit.export);      
  402.         newNode->b.oblit.decls = COPYTREE(p->b.oblit.decls);      
  403.         newNode->b.oblit.monitor = COPYTREE(p->b.oblit.monitor);      
  404.         newNode->b.oblit.ops = COPYTREE(p->b.oblit.ops);      
  405.         newNode->b.oblit.process = COPYTREE(p->b.oblit.process);      
  406.       }
  407.     } else {
  408.       assert(!p->b.atlit.f.writeSeparately);
  409.       if (p->b.atlit.id != 0) {
  410.         newNode->b.atlit.id = AllocateOID();
  411.         OTInsert(newNode, newNode->b.atlit.id);
  412.       }
  413.       for (i = newNode->firstChild; i < newNode->nChildren; i++)
  414.         newNode->b.children[i] = COPYTREE(p->b.children[i]);
  415.       if (newNode->tag == P_OBLIT && newNode->b.oblit.codeOID != 0) {
  416.         newNode->b.oblit.codeOID = AllocateOID();
  417.         OTInsert(newNode, newNode->b.oblit.codeOID);
  418.       }
  419.     }
  420.     break;
  421.       case P_OPSIG:
  422.     newNode->b.opsig.name = p->b.opsig.name;
  423.     newNode->b.opsig.params = COPYTREE(p->b.opsig.params);
  424.     newNode->b.opsig.results = COPYTREE(p->b.opsig.results);
  425.     if (doClearSymbols) {
  426.       newNode->b.opsig.where = p->b.opsig.where;
  427.     } else {
  428.       newNode->b.opsig.where = COPYTREE(p->b.opsig.where);
  429.     }
  430.     break;
  431.       case P_PARAM:
  432.     newNode->b.param.sym = COPYTREE(p->b.param.sym);
  433.     newNode->b.param.type = p->b.param.type;
  434.     newNode->b.param.constraint = p->b.param.constraint;
  435.     break;
  436.       default:
  437.     for (i = newNode->firstChild; i < newNode->nChildren; i++)
  438.       newNode->b.children[i] = COPYTREE(p->b.children[i]);
  439.     break;
  440.     }
  441.   }
  442.   return(newNode);
  443. }
  444.  
  445. NodePtr copyTree(p, clearSymbols)
  446. NodePtr p;
  447. Boolean clearSymbols;
  448. {
  449.   NodePtr result;
  450.   TRACE3(copy, 1, "Copying %s 0x%08x, dCC = %s",
  451.     tagNames[(int)p->tag], p, clearSymbols ? "true" : "false");
  452.   doClearSymbols = clearSymbols;
  453.   copyMap = Map_Create();
  454.   result = COPYTREE(p);
  455.   Map_Destroy(copyMap);
  456.   return(result);
  457. }
  458.